# # from pickle import FALSE
# #
# # animals = ['cat', 'dog', 'monkey'] # 定义列表 animals
# #
# # # list.append(obj)：在列表末尾添加新的对象。
# # animals.append('fish') # 追加元素
# # print(animals) # 输出 ['cat', 'dog', 'monkey', ‘fish’]
# #
# # # list.remove(obj)：移除列表中某个值的第一个匹配项。
# # animals.remove('fish') # 删除元素 fish
# # print(animals) # 输出 ['cat', 'dog', 'monkey']
# #
# # # list.insert(index, obj)：用于将指定对象插入列表的指定位置。index：插入位置
# # animals.insert(1,'fish') # 在下标 1 的地方插入元素 fish
# # print(animals) # 输出 ['cat', ‘fish’, 'dog', 'monkey']
# #
# # # list.pop([index=-1])：要移除列表中对下标对应的元素（默认是最后一个）。Index：下标
# # animals.pop(1) # 删除下标为 1 的元素
# # print(animals) # 输出 ['cat', 'dog', 'monkey']
# #
# # #enumerate(sequence) ：将一个可遍历的数据对象组合为一个索引序列，同时列出数据和数据下标，一般用在 for 循环当中。
# # for i in enumerate(animals):
# #     print(i) # 元素下标和元素所组成的索引
# #
# #
# #
# # squares = [x*2 for x in animals] # 批量生成符合规则的元素组成的列表
# # print(squares) # ['catcat ', 'dogdog ', 'monkeymonkey ']
# #
# # list1 = [12,45,32,55] # 定义新列表 list1
# # list1.sort() # 对列表进行排序
# # print(list1) # 输出[12,32,45,55]
# #
# # # list.reverse()：反向列表中元素。
# # list1.reverse() # 对列表进行逆置
# # print(list1) # 输出[55,45,32,12]
# #
# #
# # #元组的常用操作：
# #
# # T=(1,2,3) # 创建元组
# # print(T+(4,5)) # 元组合并，输出：(1, 2, 3, 4, 5)
# # t=(42,) # 只有一个元素的元组，区别于数字
# # tuple1 = (12,45,32,55,[1,0,3]) # 创建元祖
# # #tuple1[0] = "good" # 程序异常，元组的不可变性，不可赋值
# # tuple1[4][0] = 2 # 元组中可变的元素是可以赋值，例子中为[1,0,3]列表中元素
# # print(tuple1) # (12,45,32,55,[2,0,3])
# #
# # x = dict([("food", "Spam"),("quantity", "4"),("color","pink")])
# #
# # # dict.copy()：拷贝数据
# # d =x.copy()
# # d['color'] = 'red'
# # print(x) # {'food':'Spam','quantity':4,'color':'pink'}
# # print(d) # {'food':'Spam','quantity':4,'color':'red'}
# #
# # #元素访问
# # #print(d['name']) # 得到错误信息
# # #print(d.get('name')) # 输出 None
# # #print(d.get('name','键值不存在！')) # 输出 键值不存在
# # print(d.keys()) # 输出 dict_keys(['food', 'quantity', 'color'])
# # print(d.values()) # 输出 dict_values(['Spam', 4, 'red'])
# # print(d.items()) # 输出 dict_items([('food', 'Spam'), ('quantity', 4), ('color', 'red')])
# # d.clear() # 清空字典中的所有数据
# # print(d) # 输出 {}
# # del(d) # 删除字典
# #
# #
# # #2.2.1.6 数据类型：集合
# #
# # #集合（set）是一个无序的不重复元素序列。集合可以使用大括号{ } 或者 set() 函数创建。
# #
# # #集合的常用操作：
# #
# # sample_set = {'Prince', 'Techs'}
# # print('Data' in sample_set) # 输出 False，in 的作用是检查集合中是否存在某一元素
# #
# # # set.add(obj)：给集合添加元素，如果添加的元素在集合中已存在，则不执行任何操作
# # sample_set.add('Data') # 向集合中增加元素 Data
# # print(sample_set) # 输出 {'Prince', 'Techs', 'Data'}
# # print(len(sample_set)) # 输出 3
# #
# # # set.remove(obj)：移除集合中的指定元素。
# # sample_set.remove('Data') # 删除元素 Data
# # print(sample_set) # {'Prince', 'Techs'}
# #
# # list2 = [1,3,1,5,3]
# # print(set(list2)) # 输出{1, 3, 5}，利用集合元素的唯一性进行列表去重
# # print(list(set(list2))) # 输出 [1,3,5]列表
# # sample_set = frozenset(sample_set) # 不可变集合
#
# # for i in range(1,10):
# #     for j in range(1,i+1):
# #         print("%d*%d=%2d"%(i,j,i*j),end="\t")
# #     print()
#
# # 当满足条件时循环执行语句块，想要结束循环时，使用 break 或 continue 结束循环。
#
# # #while 循环
# # i = 0 # 新建 i 变量
# # while i<9: # 设置循环条件
# #     i+=1 # 每次循环 i 增加 1
# #     if i == 3: # 判断条件是否满足
# #         print("跳出此次循环")
# #         continue # continue 跳出当前的这一次循环
# #     if i == 5:
# #         print("跳出当前大的循环")
# #         break # 跳出当前的大的循环
# #     print(i)
#
# # # 自定义函数，要求打印不同方式传入的参数。
# #
# # def hello(greeting='hello',name='world'): # 默认参数
# #  print('%s, %s!' % (greeting, name)) # 格式化输出
# # hello() # hello，world 无参数则使用默认参数
# # hello('Greetings') # Greetings，world 位置参数
# # hello(name='Huawei') # hello，Huawei关键字参数
# # hello('Greetings','universe') # Greetings，universe 位置参数
#
#
# # f = open("Command.txt", 'w') # 打开文件 Command.txt，当文件不存在时会新建一个。w 表示文件模式为写入
# # Str = input("请输入要写入的内容：") # 内置函数 input 获取控制台的输入
# # f.write(Str) # 将 Str 写入到文件 f
# # f.close() # 关闭文件
#
#
#
# # class Network:
# #     def __init__(self):
# #         print("Network Initialized")
# #     def print_network(self):
# #         print("Network Printing")
# #
# # network = Network()
# # network.__init__()
# # network.print_network()
# # network.IP="10.10.3.8"
# # print(network.IP)
#
#
#
# # class Dog():
# #  def __init__ (self,name,age):
# #     self.name = name
# #     self.__age = age # 将 age 设置为私有属性__age
# #  def get_age(self):
# #      return self.__age
# # dog = Dog('哈士奇','2')
# # print (dog.name)
# # dog.get_age() # 调用 get_age()方法，返回参数
# # # print (dog.__age) # 这里程序将报错，显示没有__age 属性，外部无法直接调用
#
#
# import paramiko
# import time
# import logging
#
# # 配置日志记录
# logging.basicConfig(
#     level=logging.INFO,
#     format='%(asctime)s - %(levelname)s - %(message)s'
# )
# logger = logging.getLogger('huawei_switch_connection')
#
#
# def connect_to_huawei_switch(ip, username, password, commands, port=22, timeout=10):
#     """
#     连接华为交换机并执行命令
#     :param ip: 交换机IP地址
#     :param username: SSH用户名
#     :param password: SSH密码
#     :param commands: 要执行的命令列表
#     :param port: SSH端口，默认22
#     :param timeout: 连接超时时间，默认10秒
#     """
#     # 创建SSH客户端
#     client = paramiko.SSHClient()
#
#     try:
#         # 自动添加未知主机密钥（生产环境应改为手动验证）
#         client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#
#         logger.info(f"尝试连接到 {ip}...")
#         client.connect(
#             hostname="10.3.2.203",
#             port=22,
#             username="admin",
#             password="Yunwei@1688",
#             look_for_keys=False,  # 禁用密钥查找
#             allow_agent=False,  # 禁用SSH代理
#             timeout=10
#         )
#
#         logger.info("连接成功！创建交互式会话...")
#         # 创建交互式shell会话
#         chan = client.invoke_shell()
#
#         # 等待登录完成
#         time.sleep(1)
#
#         # 检查当前视图并切换到系统视图
#         output = chan.recv(1024).decode('utf-8', errors='ignore')
#         logger.debug(f"初始输出: {output}")
#
#         # 华为交换机初始登录后通常在用户视图，需要进入系统视图
#         if '>' in output:
#             chan.send('system-view\n')  # 进入系统视图
#             logger.info("进入系统视图...")
#             time.sleep(0.5)
#
#         # 禁用分页（防止输出截断）
#         chan.send('screen-length 0 temporary\n')
#         time.sleep(0.5)
#         output = chan.recv(65535).decode('utf-8', errors='ignore')
#         logger.debug(f"分页禁用结果: {output}")
#
#         # 执行用户命令
#         logger.info(f"开始执行{len(commands)}条命令...")
#         results = []
#         for cmd in commands:
#             chan.send(f'{cmd}\n')
#             time.sleep(1)  # 等待命令执行
#
#             # 获取完整输出
#             output_buffer = ""
#             while chan.recv_ready():
#                 output_buffer += chan.recv(65535).decode('utf-8', errors='ignore')
#                 time.sleep(0.3)
#
#             # 处理输出结果
#             clean_output = output_buffer.replace('\r', '')
#             results.append({
#                 'command': cmd,
#                 'output': clean_output
#             })
#             logger.info(f"命令 '{cmd}' 执行完成")
#
#         # 安全退出
#         chan.send('quit\n')  # 退出系统视图
#         time.sleep(0.5)
#         chan.send('quit\n')  # 退出SSH
#         time.sleep(0.5)
#
#         return results
#
#     except paramiko.AuthenticationException:
#         logger.error("认证失败！请检查用户名/密码")
#     except paramiko.SSHException as e:
#         logger.error(f"SSH连接错误: {str(e)}")
#     except Exception as e:
#         logger.error(f"未知错误: {str(e)}")
#     finally:
#         client.close()
#         logger.info("SSH连接已关闭")
#
#
# if __name__ == "__main__":
#     # 交换机连接参数
#     SWITCH_IP = "10.3.2.203"  # 替换为实际IP
#     USERNAME = "admin"  # 替换为实际用户名
#     PASSWORD = "Yunwei@1688"  # 替换为实际密码
#
#     # 要执行的命令
#     COMMANDS = [
#         "display version",
#         "display interface brief",
#         "display current-configuration | include sysname",
#         "display device"
#     ]
#
#     # 执行连接并获取结果
#     results = connect_to_huawei_switch(
#         ip=SWITCH_IP,
#         username=USERNAME,
#         password=PASSWORD,
#         commands=COMMANDS
#     )
#
#     # 打印结果
#     print("\n======= 命令执行结果 =======")
#     for idx, result in enumerate(results):
#         print(f"\n命令 #{idx + 1}: {result['command']}")
#         print("-" * 60)
#         print(result['output'])
#         print("=" * 60)
import re

import paramiko
import time


def connect_huawei_switch(ip, username, password):
    """连接华为交换机并执行命令"""
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    try:
        print(f"正在连接 {ip}...")
        client.connect(
            hostname=ip,
            username=username,
            password=password,
            look_for_keys=False,
            allow_agent=False,
            timeout=15,
            banner_timeout=20  # 华为设备需要更长banner时间
        )

        # 创建交互式会话
        chan = client.invoke_shell()
        time.sleep(1)

        # 读取欢迎信息
        output = chan.recv(65535).decode('utf-8')
        print(f"登录成功:\n{output}")

        f = open('Command.txt', 'r')
        cli_list = f.readlines()

        for i in cli_list:
            chan.send(i)
            time.sleep(0.5)
            output = ""
            while chan.recv_ready():
                output += chan.recv(65535).decode('utf-8', 'ignore')
                # with open('ip_list.txt', 'w') as f:
                #     f.write(output)
            print(output)
            time.sleep(2)



        # # 进入系统视图
        # chan.send("system-view\n")
        # time.sleep(0.5)
        #
        # # 禁用分页
        # chan.send("display current configuration\n")
        # time.sleep(0.5)
        #
        # # 执行命令
        # chan.send("display version\n")
        # time.sleep(1)

        # 获取输出
        # output = ""
        # while chan.recv_ready():
        #     output += chan.recv(65535).decode('utf-8', 'ignore')
        #
        # print(f"设备信息:\n{output}")

    except Exception as e:
        print(f"连接失败: {str(e)}")
    finally:
        client.close()
        print("连接已关闭")

# 使用示例
if __name__ == "__main__":
    connect_huawei_switch(
        ip="10.3.3.36",
        username="admin",
        password="Yunwei@1688"
    )